#pragma once

#include <iostream>

// 测试日志
void DumpFmtDate(std::ostream& os);
int GetLogLevel();
void SetLogLevel(int level);
#define DEBUG 1
#define WARN  2
#define ERROR 3
#define FATAL 4
#define LOG_IF_LEVEL(level, msg)                                \
        if (level >= GetLogLevel()){                            \
             std::cout  << __FILE__ << ":" << __LINE__ << "|";  \
             DumpFmtDate(std::cout); std::cout << "|";          \
             std::cout  << #level << "|"                        \
                        << msg << std::endl << std::flush;      \
        }
#ifdef NDEBUG
#define LOGDEBUG(msg)
#define LOGWARN(msg)
#define LOGERROR(msg)
#define LOGFATAL(msg)
#else
#define LOGDEBUG(msg)   LOG_IF_LEVEL(DEBUG, msg)
#define LOGWARN(msg)    LOG_IF_LEVEL(WARN, msg)
#define LOGERROR(msg)   LOG_IF_LEVEL(ERROR, msg)
#define LOGFATAL(msg)   LOG_IF_LEVEL(FATAL, msg)
#endif

// 单例
template<typename T>
class Singleton {
public:
    static T* Instance() {
        static T var;
        return &var;
    }
};
